package lendPaybackLog

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"sg-backend/global"
	"sg-backend/model/paylog"
	"time"
)

type _addType struct {
	LendId uint       `json:"lendId"`
	Money  float64    `json:"money"`
	Time   *time.Time `json:"time"`
	Remark string     `json:"remark"`
}

func AddLendPaybackLog(ctx *fiber.Ctx) error {
	// 解释数据
	var dataDto _addType
	if err := ctx.BodyParser(&dataDto); err != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("数据解释出错！%s", err),
		})
	}

	// 成功提取数据
	var updateObj paylog.LendLog
	if err := global.DB.First(&updateObj, dataDto.LendId); err.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("获取数据库出错！%s", err.Error),
		})
	}

	// 判断还钱金额不能大于借出金额
	remainMoney := updateObj.OweMoney - updateObj.PaybackMoney
	if dataDto.Money > remainMoney {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("还钱金额不能大于剩余未还金额：%f", remainMoney),
		})
	}

	// 计算新的已还金额
	totalPaybackMoney := updateObj.PaybackMoney + dataDto.Money

	// 保存还款记录
	newLog := paylog.LendPaybackLog{
		LendLogId: dataDto.LendId,
		Time:      dataDto.Time,
		Money:     dataDto.Money,
		Remark:    dataDto.Remark,
	}
	if cr := global.DB.Create(&newLog); cr.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("保存还款记录到数据库出错！%s", cr.Error),
		})
	}

	// 更新已还金额
	updateObj.PaybackMoney = totalPaybackMoney

	// 判断是否已经还清
	if totalPaybackMoney == updateObj.OweMoney {
		updateObj.Done = true
	}
	r := global.DB.Save(&updateObj)
	if r.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "已还金额保存到数据库失败！" + r.Error.Error(),
		})
	}

	// 返回
	return ctx.JSON(fiber.Map{
		"status":  "done",
		"message": "处理成功！",
	})
}
